www.gusucode.com > 基于Visual C++高级界面特效制作百例源码程序 > 基于Visual C++高级界面特效制作百例源码程序/code/char07/contentmenu/ContentMenu.cpp
// ContentMenu.cpp : implementation file // Designed by Shekar Narayanan // Please do not remove the above line // #include "stdafx.h" #include "resource.h" #include "ContentMenu.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CContentMenu CContentMenu::CContentMenu() { m_bLBDown = false; m_bHilight = true; } CContentMenu::~CContentMenu() { } BEGIN_MESSAGE_MAP(CContentMenu, CListBox) //{{AFX_MSG_MAP(CContentMenu) ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CContentMenu message handlers #define ITEM_HEIGHT 85 void CContentMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) { lpMeasureItemStruct->itemHeight = ITEM_HEIGHT; } void CContentMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CDC* pDC = CDC::FromHandle(lpDIS->hDC); CRect rcItem(lpDIS->rcItem); CRect rClient(rcItem); CRect rText; CPoint Pt(((rcItem.Width() - 32) /2 ), rcItem.top + 15); pCONTENT_ITEMS pContents = &m_pContents[lpDIS->itemID]; HICON hIcon = AfxGetApp()->LoadIcon(pContents->nImageID); rClient.DeflateRect(5,10); rcItem.CopyRect(rClient); rText.CopyRect(rClient); rText.top += 35; pDC->SetBkMode(TRANSPARENT); if (lpDIS->itemAction & ODA_DRAWENTIRE) { pDC->DrawIcon(Pt, hIcon); pDC->DrawText(pContents->strText, rText, DT_CENTER|DT_WORDBREAK); } if (m_bLBDown) { Pt.x += 2; Pt.y += 2; rcItem.OffsetRect(2,2); rText.OffsetRect(2,2); } if ((lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) { if (m_bHilight) { pDC->FillSolidRect(rClient,GetSysColor(COLOR_BTNFACE)); if (m_bLBDown) pDC->Draw3dRect(rClient,GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_BTNHIGHLIGHT)); else pDC->Draw3dRect(rClient,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_3DSHADOW)); } pDC->DrawIcon(Pt, hIcon); pDC->DrawText(pContents->strText, rText, DT_CENTER|DT_WORDBREAK); } if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & ODA_SELECT)) { pDC->FillSolidRect(rClient,GetSysColor(COLOR_WINDOW)); pDC->DrawIcon(Pt, hIcon); pDC->DrawText(pContents->strText, rText, DT_CENTER|DT_WORDBREAK); } } void CContentMenu::OnMouseMove(UINT nFlags, CPoint point) { m_Point = point; SetTimer(1,50,NULL); CListBox::OnMouseMove(nFlags, point); } void CContentMenu::OnLButtonDown(UINT nFlags, CPoint point) { m_bLBDown = true; SetCurSel(GetCurSel()); CListBox::OnLButtonDown(nFlags, point); } void CContentMenu::OnLButtonUp(UINT nFlags, CPoint point) { m_bLBDown = false; SetCurSel(GetCurSel()); CListBox::OnLButtonUp(nFlags, point); } void CContentMenu::OnTimer(UINT nIDEvent) { BOOL bOutSide; CRect rItem; CPoint CurPt; CRect rWindow; int nIndex; GetWindowRect(rWindow); GetCursorPos(&CurPt); if (!rWindow.PtInRect(CurPt)) { if (!m_bLBDown) { SetCurSel(-1); m_bHilight = false; } KillTimer(1); return; } m_bHilight = true; nIndex = ItemFromPoint(m_Point, bOutSide); if (nIndex != GetCurSel() && !bOutSide) SetCurSel(nIndex); }